import { AObject } from "./AObject";
import { ContainerType, Direction, RoutineResult } from "./Definitions";
import { N } from "./NarrativeBase";
import { Make } from "./Primitives";
import { TestRoomB, UnimplementedRoom } from "./TestScene";
import { U } from "./Util";

export let TestStairwell = U.createZone('楼梯间', [''], 
() => ({
    [Direction.Up]: [TestRoomB, 10],
    [Direction.E]: [TestCorridor1, 10]
}), {
    description: (_, ag) => U.lambdaDesc(ag,
        [`一个旧式的楼梯间，非常昏暗。原本通往楼上的狭窄螺旋形楼梯被天花板拦腰截断；然而，在原来砌死的地方，现在有一个伤口般的大洞，露出一部分本来被封在里面的楼梯，上面散布着一些黑糊糊的、熔化的东西；${TestRoomB.isLit ? '一束明亮的光线透过破洞从楼上的房间照下来' : '从洞里，你隐隐约约望见楼上的房间'}。整个楼梯间里落满了破碎的砖块和石灰。房间东面通往一个狭长的过道，旁边的墙上是一个电灯开关；在楼梯背后的黑暗中，有一扇通往地下室的小门。`],
        [`墙上，旧式白炽灯管发出略微昏暗的光线，照亮了这个旧式的楼梯间。天花板延伸出一大块从颜色上看是新砌的部分，把通往楼上的狭窄螺旋形楼梯拦腰截断；然而现在那里有一个伤口般的大洞，露出一部分本来被封在里面的楼梯，表面有点烧焦，散布着某种熔化了的密封材料，以及板材和电线七零八落的碎片。透过破洞，${TestRoomB.isLit ? '你能看见楼上房间的灯光' : '楼上的房间看上去漆黑一片'}。整个楼梯间里落满了破碎的砖块和石灰。房间东面通往一个狭长的过道。楼梯背后的空间里，有一扇通往地下室的小门。`],
        [`手电筒的光照亮了一个昏暗的旧式楼梯间。天花板延伸出一大块从颜色上看是新砌的部分，把通往楼上的狭窄螺旋形楼梯拦腰截断；然而现在那里有一个伤口般的大洞，露出一部分原先被封在里面的楼梯，表面有点烧焦，散布着某种熔化了的密封材料；${TestRoomB.isLit ? '一束明亮的光线透过破洞从楼上的房间照下来' : '从洞里可以隐约照见楼上的房间'}。整个楼梯间里落满了破碎的砖块和石灰。房间东面通往一个狭长的过道；旁边的墙上有一段旧式的灯管。在楼梯背后的黑暗中，有一扇通往地下室的小门。`]),
    temperature: 13
});

let light = new AObject('电灯开关', ['灯', '电灯', '灯管', '开关', '东西'], {
    description: (self, ag) => U.lambdaDesc(ag,
        ['模模糊糊地，电灯外壳看上去像一个狭长的笼子。墙上有一个开关。'],
        [`灯管的外壳看上去像某种狭长的金属笼子，固定在墙壁上，${self.switchState ? '灯丝在泛黄的胶囊形玻璃里灼热发亮' : '里面是泛黄的胶囊形玻璃'}。墙上附近有一个开关。`]),
    isSwitch: true,
    switchState: false,
    showInDescription: false,
    afterAction: {
        TurnOn: function* (self, ag) {
            TestStairwell.isLit = true;
            return RoutineResult.Continue();
        },
        TurnOff: function* (self, ag) {
            TestStairwell.isLit = false;
            return RoutineResult.Continue();
        }
    }
});
let door = Make.door(() => UnimplementedRoom, 5, 
    '通往地下室的门', ['门', '小门', '地下室', '地下室门'], { isLocked: true });
TestStairwell.addObjectInternal(light, door);

let TestCorridor1 = U.createZone('走廊', [''], 
() => ({
    [Direction.W]: [TestStairwell, 10],
    [Direction.E]: [TestCorridor2, 5]
}), {
    description: (_, ag) => U.lambdaDesc(ag,
        [`狭窄的走廊延伸向东侧；西边通往楼梯间。这里非常昏暗。`],
        [`狭窄的走廊延伸向东侧；西边通往楼梯间。`]),
    temperature: 13
});

let TestCorridor2 = U.createZone('走廊', [''], 
() => ({
    [Direction.W]: [TestCorridor1, 5],
    [Direction.E]: [TestCorridor3, 5]
}), {
    description: (_, ag) => U.lambdaDesc(ag,
        [`狭窄的走廊延伸向东侧和西侧。这里非常昏暗${wall.contents.size > 0 ? '；你在墙上辨认出一副画的大致形状' : ''}。`],
        [`狭窄的走廊延伸向东侧和西侧。你身边的墙上有${wall.contents.size > 0 ? '一幅小画。' : '一块矩形的暗色区域。'}`]),
    temperature: 13
});
let wall = new AObject('墙', ['区域', '钉子'], {
    showInDescription: false,
    description: (self, ag) => U.lambdaDesc(ag,
        [`${self.contents.size > 0 ? '你在墙上辨认出一副画的大致形状' : '你没有看见任何特别之处'}。`],
        [`墙上${self.contents.size > 0 ? '挂着一幅小画。' : '有一块矩形的浅色区域，其顶部有一个钉子。'}`]),
    containerType: ContainerType.Surface,
    mouthSize: 1000,
    beforeAddContent: function* (_, ag, obj) {
        if (obj != painting1) {
            U.thought(ag, N.SP(ag, '没法把它挂到墙上')).submitMomentary();
            return RoutineResult.CustomError();
        } else {
            U.thought(ag, N.SP(ag, '把画挂回到墙上，与那块浅色区域重合并遮蔽了它')).submitMomentary();
            return RoutineResult.ContinueSilent();
        }
    },
    beforeRemoveContent: function* (self, ag, obj) {
        U.thought(ag, ['墙上原来挂着画的地方，现在是一块浅色的区域']);
        return RoutineResult.Continue();
    },
})
let painting1 = new AObject('画', ['绘画', '油画', '小画', '东西'], {
    description: U.desc(
        ['这是一幅小小的油画，带着朴素的木框；光线太暗，你看不清画上是什么。'],
        ['这是一幅小小的风景油画，带着朴素的木框。画面上，粗厚的笔触描绘出天空和山丘，它们有一种矿物般的蓝色，偶尔混合着暗绿、青色和灰白的色块。随着山丘延伸进画面底部的乳白色海水，笔触不断变细；水面的某些细节处泛起蓝绿和淡红色的微光。']),
    isTakable: true,
    size: 30*25*3,
    mass: 0.5,
    diameter: 25,
});
wall.addContentInternal(painting1);
TestCorridor2.addObjectInternal(wall);

let TestCorridor3 = U.createZone('走廊', [''], 
() => ({
    [Direction.W]: [TestCorridor2, 10],
    [Direction.E]: [TestCorridorEnd, 5]
}), {
    description: (_, ag) => U.lambdaDesc(ag,
        [`狭窄的走廊延伸向西侧；另一边，你能远远望见走廊的尽头，那里一扇窗户发出苍白的光芒，但显然无法驱散这里的昏暗。`],
        [`狭窄的走廊延伸向西侧；另一边，你能远远望见走廊的尽头。`]),
    temperature: 13,
});

let TestCorridorEnd = U.createZone('走廊尽头', [''], 
() => ({
    [Direction.W]: [TestCorridor3, 5],
}), {
    description: (_, ag) => U.lambdaDesc(ag,
        [`你来到了一条狭窄走廊的尽头；一扇大窗把室外苍白的光线洒在地面上、墙上和你的身上。往西侧看去，走廊的深处仍然昏暗。`]),
    isLit: true,
    temperature: 13
});